#include <QCoreApplication>
#include <iostream>
#include <vector>
#include <string>

using namespace std;

void pr_3_43()
{
    constexpr size_t rowCnt = 3, colCnt = 4;
    int ia[rowCnt][colCnt];
    size_t cnt = 0;
    for (auto &row : ia) {
        for (auto &col : row) {
            col = cnt; // 将元素位置的索引作为它的值
            ++cnt;
        }
    }

    // 使用范围 for输出 ia
    cout << "使用范围 for 输出 ia" << endl;
    for (int (&row)[colCnt] : ia) { // 注意row数组包含 colCnt元素
        for (int &col : row) {
            cout << col << ' ';
        }
        cout << endl;
    }
    // 使用普通 for和下标输出
    cout << "使用普通 for和下标输出 ia" << endl;
    for (size_t i = 0; i != rowCnt; ++i) {
        for (size_t j = 0; j != colCnt; ++j) {
            cout << ia[i][j] << ' ';
        }
        cout << endl;
    }
    // 使用普通 for和指针输出
    cout << "使用普通 for和指针输出 ia" << endl;
    for (int (*p)[colCnt] = begin(ia); p != end(ia); ++p) {
        for (int *q = begin(*p); q != end(*p); ++q) {
            cout << *q << ' ';
        }
        cout << endl;
    }
}

void pr_3_44()
{
    using int_array = int[4];
    constexpr size_t rowCnt = 3, colCnt = 4;
    int ia[rowCnt][colCnt];
    size_t cnt = 0;
    for (auto &row : ia) {
        for (auto &col : row) {
            col = cnt; // 将元素位置的索引作为它的值
            ++cnt;
        }
    }
    // 使用范围 for输出 ia
    cout << "使用范围 for 输出 ia" << endl;
    for (int_array &row : ia) {
        for (int &col : row) {
            cout << col << ' ';
        }
        cout << endl;
    }
    // 使用普通 for和下标输出
    cout << "使用普通 for和下标输出 ia" << endl;
    for (size_t i = 0; i != rowCnt; ++i) {
        for (size_t j = 0; j != colCnt; ++j) {
            cout << ia[i][j] << ' ';
        }
        cout << endl;
    }
    // 使用普通 for和指针输出
    cout << "使用普通 for和指针输出 ia" << endl;
    for (int_array *p = begin(ia); p != end(ia); ++p) {
        for (int *q = begin(*p); q != end(*p); ++q) {
            cout << *q << ' ';
        }
        cout << endl;
    }
}

void pr_3_45()
{
    constexpr size_t rowCnt = 3, colCnt = 4;
    int ia[rowCnt][colCnt];
    size_t cnt = 0;
    for (auto &row : ia) {
        for (auto &col : row) {
            col = cnt; // 将元素位置的索引作为它的值
            ++cnt;
        }
    }
    // 使用范围 for输出 ia
    cout << "使用范围 for 输出 ia" << endl;
    for (auto &row : ia) {
        for (auto &col : row) {
            cout << col << ' ';
        }
        cout << endl;
    }
    // 使用普通 for和下标输出
    cout << "使用普通 for和下标输出 ia" << endl;
    for (auto i = 0; i != rowCnt; ++i) {
        for (auto j = 0; j != colCnt; ++j) {
            cout << ia[i][j] << ' ';
        }
        cout << endl;
    }
    // 使用普通 for和指针输出
    cout << "使用普通 for和指针输出 ia" << endl;
    for (auto *p = begin(ia); p != end(ia); ++p) {
        for (auto *q = begin(*p); q != end(*p); ++q) {
            cout << *q << ' ';
        }
        cout << endl;
    }
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    pr_3_45();

    return a.exec();
}
